postgresql 您所在的位置:网站首页 sql 执行脚本 postgresql

postgresql

2023-09-27 23:35| 来源: 网络整理| 查看: 265

前言:

对于数据库的维护而言,肯定是有SQL脚本的执行,例如,某个项目需要更新,那么,可能会有很多的SQL脚本需要执行,SQL脚本可能会包含有建表,插入数据,索引建立,约束建立,主外键建立等等内容。

那么,几个SQL脚本可能无所谓,navicat或者psql命令行 简简单单的就导入了,但是有的时候脚本会比较多并且有的时候脚本会有执行顺序要求,很显然,navicat会力不从心的,一个个点SQL文件导入也会有遗漏的情况,因此,编写一个可自动执行SQL脚本文件的shell脚本就显得很有必要了。

下面,将就以上需求,编写一个可用的,通用的批量导入SQL脚本。

一,

SQL脚本的内容

#!/bin/bash #!author zsk set -eu #describe 该脚本是批量导入SQL语句的脚本。 #set -eu是检查脚本内的变量,防止空参的情况出现。 #如果SQL脚本遇到错误,将会立刻停止,主要是参数-v ON_ERROR_STOP=1的作用 #变量 $1 是SQL脚本的存放路径,没有对SQL脚本文件的检查,因此,请确定输入的目录正确性 # 该脚本限定运行在非root用户,也就是普通用户下,在执行SQL脚本的同时输出logs文件在普通用户根目录下 #如果有任何错误,可查看日志文件并结合该脚本的控制台输出查找问题并及时解决。 #以下是五个变量,按需要修改即可。 sql_file=`ls $1|grep sql |sort -n` database=test pg_user=postgres port=5432 pwd=$1 mkdir -p $pwd/success sqlfile_success=$pwd/success #这个是批量执行SQL文件的入口函数,日志文件放置在了postgresql用户的根目录 #如果有SQL脚本执行失败,脚本将会停止,如果SQL脚本执行成功,将会打印成功执行的SQL脚本名称 #成功执行的脚本将被移动到脚本所在目录下的success目录下,将执行失败的脚本原因找到后 #可再次从失败的SQL脚本执行,等于断点执行。 sql1 () { echo $sql_file for i in $sql_file do psql -U$pg_user -p$port -d $database -v ON_ERROR_STOP=1 -f $pwd$i 2>&1 >>~/logs if [ $? -eq 0 ] then echo -e "\033[32m $pwd$i 这个SQL脚本执行成功了!!!!\033[0m" mv $pwd$i $pwd/success/ echo -e "\033[33m $pwd$i $pwd$i 移动到了success目录下 \033[0m" else echo -e "\033[31m $dir$i 这个SQL脚本没有能够执行成功,请查看日志查找原因!!!!\033[0m" exit fi done } if [ `whoami` == "root" ] then #天蓝底黑字 echo -e "\033[46;30m 该脚本不能运行在root用户下,请在postgresql用户下运行该脚本,脚本即将结束!!!\033[0m" sleep 5 exit else read -p "检查SQL文件,请确定文件是否是正确的排列顺序,并做出选择,yes,批量运行指定SQL脚本;no,退出此脚本:" result echo -e "\033[35m 将要批量执行的SQL文件如下:$result \033[0m" case $result in "yes") sql1 ;; "no") echo -e "\033[45;30m 您的选择是no,因此,该脚本将会自行退出了!!!!\033[0m" exit 110 ;; *) echo -e "\033[41;30m 您的选择不合适,不是yes或者no,请重新运行脚本,慎重输入您的选择!!!\033[0m" exit 220 ;; esac fi 二, 脚本功能介绍

以上脚本具有以下功能,并经过了测试,对于多少个SQL脚本,基本都是毫无压力

1,

脚本限定运行在普通用户下,如果是root用户,该脚本将不会被执行

2,

脚本内的变量问题

需要根据自己的实际情况修改变量,主要是这三个变量:

database=test pg_user=postgres port=5432

SQL脚本内定义的数据库名称,本例是test数据库,一般情况下,SQL脚本最好还是使用postgre这个超级用户,以确保SQL脚本的正确执行。port是数据库开放的端口,一般都不会是默认的5432端口

3,

shell脚本的逻辑

通过$1也就是外部参数,这个参数是SQL脚本的存放路径,该参数传入脚本后,首先,运行用户检测if语句,判断是非root用户后,将进入下一步,否则脚本退出。

read命令后,接收用户输入,限定在yes,no,或者其它输出的选择,如果是输入的yes,那么,就开始SQL导入,这里是调用上面的函数,函数名称是psql1,如果有一些别的想法还没准备好,那么,输入no,将会退出脚本。如果输错了,也就是其它任意,也会退出脚本,并做一个小的提示:重新运行脚本

sql1函数是脚本的主要功能,通过for循环,读取外部参数$1设定的目录下的所有SQL文件,并按SQL文件的名称排序,并逐个执行。

如果在执行SQL脚本中,SQL脚本有报错,将会停止整个脚本,并在控制台打印出错信息,如果执行成功的,将把成功执行的SQL脚本文件移入$1 目录下新建的success文件夹,也就达到了断点执行的效果。

三, 脚本执行的效果示例:

SQL脚本内容:

[pg1@EULEER ~]$ cat SQL/1emp-bak.sql -- -- PostgreSQL database dump -- -- Dumped from database version 12.5 -- Dumped by pg_dump version 12.5 SET statement_timeout = 0; SET lock_timeout = 0; SET idle_in_transaction_session_timeout = 0; SET client_encoding = 'UTF8'; SET standard_conforming_strings = on; SELECT pg_catalog.set_config('search_path', '', false); SET check_function_bodies = false; SET xmloption = content; SET client_min_messages = warning; SET row_security = off; SET default_tablespace = ''; SET default_table_access_method = heap; -- -- Name: emp; Type: TABLE; Schema: mytest; Owner: postgres -- drop table if exists mytest.emp ; CREATE TABLE if not exists mytest.emp ( empno numeric NOT NULL, ename character varying(10), job character varying(9), mgr numeric, hiredate date, sal numeric(7,2), comm numeric(7,2), deptno numeric(2,0) ); ALTER TABLE mytest.emp OWNER TO postgres; -- -- Data for Name: emp; Type: TABLE DATA; Schema: mytest; Owner: postgres -- COPY mytest.emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) FROM stdin; 7369 SMITH CLERK 7902 1980-12-17 800.00 \N 20 7499 ALLEN SALESMAN 7698 1981-02-20 1600.00 300.00 30 7521 WARD SALESMAN 7698 1981-02-22 1250.00 500.00 30 7566 JONES MANAGER 7839 1981-04-02 2975.00 \N 20 7654 MARTIN SALESMAN 7698 1981-09-28 1250.00 1400.00 30 7698 BLAKE MANAGER 7839 1981-05-01 2850.00 \N 30 7782 CLARK MANAGER 7839 1981-06-09 2450.00 \N 10 7788 SCOTT ANALYST 7566 0087-04-19 3000.00 \N 20 7839 KING PRESIDENT \N 1981-11-17 5000.00 \N 10 7844 TURNER SALESMAN 7698 1981-09-08 1500.00 0.00 30 7876 ADAMS CLERK 7788 0087-05-23 1100.00 \N 20 7900 JAMES CLERK 7698 1981-12-03 950.00 \N 30 7902 FORD ANALYST 7566 1981-12-03 3000.00 \N 20 7934 MILLER CLERK 7782 1982-01-23 1300.00 \N 10 \. -- -- Name: emp pk_emp; Type: CONSTRAINT; Schema: mytest; Owner: postgres -- ALTER TABLE ONLY mytest.emp ADD CONSTRAINT pk_emp PRIMARY KEY (empno); -- -- Name: emp fk_deptno; Type: FK CONSTRAINT; Schema: mytest; Owner: postgres -- --ALTER TABLE ONLY mytest.emp -- ADD CONSTRAINT fk_deptno FOREIGN KEY (deptno) REFERENCES mytest.dept(deptno); -- -- PostgreSQL database dump complete --

输入no和任意输出的结果: 

正确输入yes后的SQL脚本批量执行:

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有